﻿Namespace Util.Dados

    ' Código exemplo 
    'public class ListToGenericListConverter<T>
    '{
    '    /// <summary>
    '    /// Converts a non-typed collection into a strongly typed collection.  This will fail if
    '    /// the non-typed collection contains anything that cannot be casted to type of T.
    '    /// </summary>
    '    /// <param name="listOfObjects">A <see cref="ICollection"/> of objects that will
    '    /// be converted to a strongly typed collection.</param>
    '    /// <returns>Always returns a valid collection - never returns null.</returns>
    '    public List<T> ConvertToGenericList(IList listOfObjects)
    '    {
    '       ArrayList notStronglyTypedList = new ArrayList(listOfObjects);
    '       return new List<T>(notStronglyTypedList.ToArray(typeof(T)) as T[]);
    '    }
    ' }

    ''' <summary>
    ''' Classe que contém um conjunto de métodos para conversão de listas de e para o tipo T.
    ''' </summary>
    ''' <typeparam name="T">Tipo para conversão</typeparam>
    ''' <remarks></remarks>
    Public Class ConversorDeListas(Of T)

        ''' <summary>
        ''' Converte uma lista não tipada numa lista tipada de tipo T.
        ''' Este método vai falhar se algum elemento da lista não for do tipo T.
        ''' </summary>
        ''' <param name="listaDeObjetos">Lista de objetos para conversão.Todos os elementos devem ser 
        ''' do tipo T</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function ConverterParaEspecifica(ByVal listaDeObjetos As IList) As IList(Of T)
            Dim generica As New ArrayList(listaDeObjetos)
            Dim o As T
            Return New List(Of T)(generica.ToArray(o.GetType))
        End Function

        ''' <summary>
        ''' Converte uma lista não tipada numa lista tipada de tipo T.
        ''' Este método vai falhar se algum elemento da lista não for do tipo T.
        ''' </summary>
        ''' <param name="_linkedList">Lista de objetos para conversão.Todos os elementos devem ser 
        ''' do tipo T</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function ConverterParaLista(ByVal _linkedList As LinkedList(Of Object)) As IList(Of T)
            If Not IsNothing(_linkedList) Then
                If _linkedList Is Nothing Then Throw New Exception("Método não pode ser chamado com lista vazia")
                Dim saida As New List(Of T)

                For Each item In _linkedList
                    saida.Add(DirectCast(item, T))
                Next
                Return saida
            Else
                Return Nothing
            End If
        End Function

        ''' <summary>
        ''' Converte uma listaencadeada do tipo T  numa lista comum de tipo T.
        ''' Este método vai falhar se algum elemento da lista não for do tipo T.
        ''' </summary>
        ''' <param name="_linkedList">Lista de objetos para conversão.Todos os elementos devem ser 
        ''' do tipo T</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function ConverterParaLista(ByVal _linkedList As LinkedList(Of T)) As List(Of T)
            If Not IsNothing(_linkedList) Then
                If _linkedList Is Nothing Then Throw New Exception("Método não pode ser chamado com lista vazia")
                Dim saida As New List(Of T)

                For Each item In _linkedList
                    saida.Add(item)
                Next
                Return saida
            Else
                Return Nothing
            End If
        End Function

    End Class
End Namespace
